package demo4;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class Demo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {

        //学习如何获得成员方法是不包括构造方法的

        Class<?> clazz = Class.forName("demo4.Student");

        //获取其中所有的公有的方法对象，并且包括父类的
        Method[] m1 = clazz.getMethods();
        for (Method m : m1) {
            System.out.println(m);
        }
        System.out.println("---------");

        //获取其中所有的方法包括私有，但是不会包括父类的方法了
        Method[] dm1 = clazz.getDeclaredMethods();
        for (Method m : dm1) {
            System.out.println(m);
        }

        System.out.println("---------");
        //获得指定的单一方法
        Method m2 = clazz.getDeclaredMethod("eat", String.class);
        System.out.println(m2);

        System.out.println("--------");

        //获得方法的修饰符
        int modifiers = m2.getModifiers();
        System.out.println(modifiers);

        //获得方法的名字
        String name = m2.getName();
        System.out.println(name);//eat

        //获得方法的形参
        Parameter[] parameters = m2.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }

        //获得方法的异常
        Class<?>[] exceptionTypes = m2.getExceptionTypes();
        for (Class<?> exceptionType : exceptionTypes) {
            System.out.println(exceptionType);
        }
        System.out.println("关于方法的运行之后");
        //实现方法运行再获取返回值
        Student stu = new Student();
        m2.setAccessible(true);
        //使用方法的同时传递参数
        String resu = (String) m2.invoke(stu, "汉堡包");
        System.out.println(resu);
    }
}
